package com.system.cacheClient.client;

import com.system.cacheClient.common.CacheR;

import java.util.Set;

/**
 * ZSet缓存客户端接口
 * 提供ZSet类型的特殊操作方法
 */
public interface ZSetCacheClient {
    
    /**
     * 向ZSet中添加元素
     * @param key ZSet键
     * @param value 元素
     * @param score 分数
     * @param <T> 数据类型
     * @return 添加成功的元素个数
     */
    <T> CacheR<Boolean> zadd(String key, T value, double score);
    
    /**
     * 从ZSet中移除元素
     * @param key ZSet键
     * @param values 要移除的元素
     * @param <T> 数据类型
     * @return 移除成功的元素个数
     */
    <T> CacheR<Long> zrem(String key, T... values);
    
    /**
     * 获取ZSet中指定元素的分数
     * @param key ZSet键
     * @param member 元素
     * @param <T> 数据类型
     * @return 元素的分数
     */
    <T> CacheR<Double> zscore(String key, T member);
    
    /**
     * 获取ZSet中元素的排名（按分数从小到大）
     * @param key ZSet键
     * @param member 元素
     * @param <T> 数据类型
     * @return 元素的排名
     */
    <T> CacheR<Long> zrank(String key, T member);
    
    /**
     * 获取ZSet中指定范围的元素（按分数从小到大）
     * @param key ZSet键
     * @param start 起始位置
     * @param end 结束位置
     * @param <T> 数据类型
     * @return 元素集合
     */
    <T> CacheR<Set<T>> zrange(String key, long start, long end);
    
    /**
     * 获取ZSet的大小
     * @param key ZSet键
     * @return ZSet的大小
     */
    CacheR<Long> zcard(String key);
    
    /**
     * 获取ZSet中指定分数范围的元素个数
     * @param key ZSet键
     * @param min 最小分数
     * @param max 最大分数
     * @return 元素个数
     */
    CacheR<Long> zcount(String key, double min, double max);
}